【小ネタ】AWS CLIでS3のPre-Signed URLを生成できるようになっていました!
西澤です。およそ1ヶ月前にリリースされていた機能なので、ブログに書くには遅すぎた感もありますが、社内担当で知らない者もいたので、小ネタですが書いておこうと思います。
最新版のAWS CLIを使えば、Pre-Signed URLを簡単に生成できるようになっています。正確には、aws s3
コマンドのサブコマンドとして、v1.10.59からpresign
が追加されていますので、こちらの機能をご紹介したいと思います。
- 1.10.59
- feature:s3: Add a new aws s3 presign command, closes #462
aws-cli/CHANGELOG.rst at develop · aws/aws-cli
Pre-Signed(署名付き) URLとは?
Pre-Signed URLとは、S3上のオブジェクトに期限付きURLを生成する機能です。正確には、アップロードとダウンロードの2種類があるのですが、今回AWS CLIで利用できるようになった機能は、GET(ダウンロード)の方だけのようです。
AWS SDK他を利用した署名付きURLの生成が少々面倒だった経緯について、下記ページをざっとご覧いただければおわかりいただけるかと思います。S3のAPIベースの操作では実現できない為、AWS SDKでも対応状況がバラバラというのが現状です。非常に便利で有用な機能であるのにも関わらず、開発者以外の方が利用するには敷居が高い状況だったのではないでしょうか?
- Boto3でS3のpre-signed URLを生成する | Developers.IO
- GUIのみでS3のPre Signed-URLを作成する | AWS情報ブログ
- 署名付き URL を使用したオブジェクトのアップロード - Amazon Simple Storage Service
- Amazon S3 Pre-Signed URL — AWS SDK for PHP documentation
- Examples Using Node.js — AWS SDK for JavaScript
AWS CLIでPre-Signed URLを生成してみる
基本的な使い方
それでは使い方を簡単に確認して、試してみます。今回の機能はGET専用なので、既にS3に配置したオブジェクトのダウンロード用URLが生成されるイメージとなります。まずは、事前にオブジェクトを配置しておきます。Pre-Signed URLを生成するIAMユーザには、S3ReadOnlyだけ付与しておけば問題無く動作しました。
$ aws sts get-caller-identity { "Account": "697xxxxxx005", "UserId": "AIDAxxxxxxxxxxxxSTPC", "Arn": "arn:aws:iam::697xxxxxx005:user/testuser" } $ aws s3 ls s3://test-697xxxxxx005-bucket/sample.txt 2016-09-21 14:01:12 16 sample.txt
このオブジェクトには、特別なACLやバケットポリシーは設定されていません。その為、そのままこのオブジェクトのリンクURLにアクセスしても当然アクセスすることができません。
それでは、Pre-Signed URLを生成してみます。コマンドは非常にシンプルです。
$ aws s3 presign help PRESIGN() NAME presign - DESCRIPTION Generate a pre-signed URL for an Amazon S3 object. This allows anyone who receives the pre-signed URL to retrieve the S3 object with an HTTP GET request. SYNOPSIS presign <S3Uri> [--expires-in <value>] OPTIONS path (string) --expires-in (integer) Number of seconds until the pre-signed URL expires. Default is 3600 seconds. PRESIGN()
他のaws s3
コマンドと同じようにS3オブジェクトのパスを指定して、--expires-in
で有効期限を指定するだけです。指定なし(デフォルト)では、1h(= 60s x 60)となります。それでは試してみます。
$ date 2016年 9月21日 水曜日 16時21分36秒 JST $ aws s3 presign s3://test-697xxxxxx005-bucket/sample.txt --expires-in 60 https://test-697xxxxxx005-bucket.s3.amazonaws.com/sample.txt
URL内のExpires
で指定された数値が、UNIXTIMEで表現された有効期限です。
$ date -r 1474442558 2016年 9月21日 水曜日 16時22分38秒 JST
無事にアクセスできました。
しばらくすると、アクセスができなくなりました。想定通りですね。(※ブラウザキャッシュクリアが必要な場合がありました)
まとめ
ちょっとしたリリースなのですが、一時的なファイルの受け渡しに利用する等、AWSの利用可能性の広がるアップデートではないかと思います。まだ試したことが無い方はぜひ試してみてください。
どこかの誰かのお役に立てば嬉しいです。